package TankGame;

// 该类用于表示游戏中的子弹
// 包括子弹的位置、速度、飞行角度、爆炸效果等属性和移动、绘制等方法。
// 涉及到 Java 的图形绘制和数学计算相关知识。

import java.awt.*;
import java.io.Serializable;

// Bullet类表示游戏中的子弹，具有位置、速度、角度等属性，以及移动、绘制和碰撞检测等方法
public class Bullet implements Serializable {
    int x, y; // 子弹在游戏面板中的坐标
    int speed = 10; // 子弹的移动速度
    double angle; // 子弹的飞行角度
    int explosionFrames = 5; // 子弹爆炸效果的帧数
    boolean exploded = false;
    private final boolean isPlayerBullet; // 标记子弹是否为玩家发射

    // 构造函数，用于初始化子弹的属性
    public Bullet(int startX, int startY, double angle, boolean isPlayerBullet) {
        this.x = startX;
        this.y = startY;
        this.angle = angle;
        this.isPlayerBullet = isPlayerBullet;
    }

    // 移动子弹的方法，根据速度和角度更新子弹的位置，若子弹已爆炸则减少爆炸帧数
    public void move() {
        if (!exploded) {
            // 运用数学知识求移动的距离
            x += speed * Math.cos(angle);
            y -= speed * Math.sin(angle);
        } else {
            explosionFrames--;
            if (explosionFrames <= 0) {
                exploded = true;
            }
        }
    }

    // 在给定的Graphics2D对象上绘制子弹，未爆炸时为黄色圆形，爆炸时为橙色圆形
    public void draw(Graphics2D g) {
        if (!exploded) {
            g.setColor(Color.YELLOW);
            g.fillOval(x, y, 10, 10);
        } else {
            g.setColor(Color.ORANGE);
            g.fillOval(x - 10, y - 10, 30, 30);
        }
    }

    // 获取子弹的矩形边界，用于碰撞检测
    public Rectangle getBounds() {
        return new Rectangle(x, y, 10, 10);
    }

    // 判断子弹是否已爆炸
    public boolean isExploded() {
        return exploded;
    }

    // 获取子弹的x坐标
    public int getX() {
        return x;
    }

    // 获取子弹的y坐标
    public int getY() {
        return y;
    }

    // 获取子弹是否为玩家发射的标记
    public boolean isPlayerBullet() {
        return isPlayerBullet;
    }
}
